#!/home/joshua/.pyenv/versions/2.7.13/bin/python
# -*- coding: utf-8 -*-

from twisted.protocols import ftp
from twisted.cred import portal, checkers
from zope.interface import implements
from twisted.python import filepath


class MyFTPRealm:
    implements(portal.IRealm)
    def __init__(self, anonymousRoot):
        self.anonymousRoot = filepath.FilePath(anonymousRoot)
        self.dir = {'alice':'/tmp/ftp1','bob':'/tmp/ftp2'}

    def requestAvatar(self, avatarId, mind, *interfaces):
        for iface in interfaces:
            if iface is ftp.IFTPShell:
                if avatarId is checkers.ANONYMOUS:
                    avatar = ftp.FTPAnonymousShell(self.anonymousRoot)
                else:
                    user_dir = self.dir[avatarId]
                    avatar = ftp.FTPShell(filepath.FilePath(user_dir))
                return (ftp.IFTPShell, avatar,
                        getattr(avatar, 'logout', lambda: None))
        raise NotImplementedError("Only IFTPShell interface is supported by this realm")

# 这个./表示本地路径，是匿名用户的默认文件夹
p = portal.Portal(MyFTPRealm('./'))
p.registerChecker(checkers.AllowAnonymousAccess())

# user.db文件是所有非匿名用户的用户名和密码，格式如下
# lilei:password
p.registerChecker(checkers.FilePasswordDB("user.db"))
f = ftp.FTPFactory(p)


from twisted.internet import reactor
reactor.listenTCP(21, f)
reactor.run()
